package gruppo12.msp;

import java.util.ArrayList;

import java.util.Iterator;

import gruppo12.msp.data.ConnessioneGoogle;
import gruppo12.msp.elaboration.Elaborazione;
import gruppo12.msp.elaboration.PDI;
import gruppo12.msp.elaboration.Pianificazione;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;

import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;

/**
 * <p>
 * Classe che implementa l'interfaccia relativa alla ricerca manuale di un PDI
 * </p>
 * 
 * @author Duca Antonio, Festa Jacopo, Fiorilli Domenico, Granese Dante, Lemma
 *         Saverio, Lombardi Marco e Pierno Fiore
 * 
 */
public class RicercaManualeActivity extends Activity {
	Elaborazione elaborazione;
	Pianificazione pianificazione;
	private ArrayList<PDI> listaPDIOttenuti;
	private ArrayList<PDI> itinerario;
	private ArrayList<PDI> listaPDITrovati;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		/* Dichiarazioni */
		final EditText et;
		final Button ricerca;

		/* Associazione con gli oggetti grafici dell'xml */
		setContentView(R.layout.ricercamanuale);
		et = (EditText) findViewById(R.id.ricercaManualeText);
		ricerca = (Button) this.findViewById(R.id.buttonRicercaManuale);

		/* Inizializzazione variabili */
		ricerca.setEnabled(false);
		listaPDIOttenuti = new ArrayList<PDI>();
		itinerario = new ArrayList<PDI>();
		listaPDITrovati = new ArrayList<PDI>();

		/*
		 * Bottone ricerca inizialmente disattivato, listener per attivarlo non
		 * appena scrivo qualcosa
		 */
		et.addTextChangedListener(new TextWatcher() {
			public void afterTextChanged(Editable s) {
				if (s.length() > 0) {
					ricerca.setEnabled(true);
					ricerca.setCompoundDrawablesWithIntrinsicBounds(
							R.drawable.ricerca, 0, 0, 0);
				} else {
					ricerca.setEnabled(false);
					ricerca.setCompoundDrawablesWithIntrinsicBounds(
							R.drawable.ricerca_disabled, 0, 0, 0);
				}
			}

			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
			}

			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
			}
		});

		/* Listener del pulsante ricerca */
		ricerca.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				/*
				 * Quando l'utente seleziona il tasto ricerca, il tastierino
				 * scompare dal display
				 */
				InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm.hideSoftInputFromWindow(et.getWindowToken(), 0);

				/* Lettura del contenuto di EditText nella stringa "str0" */
				String str0 = et.getText().toString();
				/* Avvio il metodo lanciaricerca */
				lanciaRicerca(str0);
			}
		});
	}

	/**
	 * <p>
	 * Metodo che effettua la ricerca per nome su google del PDI
	 * </p>
	 * 
	 * @param nomePdi
	 *            Nome del PDI scritto manualmente dall'utente
	 */
	public void lanciaRicerca(final String nomePdi) {

		/* Dichiarazioni */
		final Button bottoneProsegui;
		final ArrayList<CheckBox> checkBoxSelezionaTutto;
		final ProgressDialog dialog;
		final Handler handler;

		/* Recupero dei dati della precedente schermata */
		Intent intent = getIntent();
		String pkg = getPackageName();

		elaborazione = (Elaborazione) intent.getSerializableExtra(pkg
				+ ".elaborazione");
		pianificazione = (Pianificazione) intent.getSerializableExtra(pkg
				+ ".pianificazione");

		itinerario = pianificazione.getItinerario();

		/* Associazione con gli oggetti grafici dell'xml */
		bottoneProsegui = (Button) this.findViewById(R.id.buttonProsegui);

		/* Inizializzazione variabili */
		checkBoxSelezionaTutto = new ArrayList<CheckBox>();

		dialog = ProgressDialog.show(this, "Attendere", "Ricerca in corso...",
				true);
		handler = new Handler() {
			public void handleMessage(Message msg) {
				Iterator<PDI> pditerator = listaPDITrovati.iterator();

				while (pditerator.hasNext()) {
					PDI pdi = (PDI) pditerator.next();
					listaPDIOttenuti.add(pdi);
				}

				LinearLayout layoutPDI = (LinearLayout) findViewById(R.id.sceltaPDICheckBoxLinearLayout);
				if (!listaPDIOttenuti.isEmpty()) {
					layoutPDI.setVisibility(View.VISIBLE);
					Iterator<PDI> pditeratore = listaPDIOttenuti.iterator();
					while (pditeratore.hasNext()) {
						PDI pdi = (PDI) pditeratore.next();
						final CheckBox c = new CheckBox(
								RicercaManualeActivity.this);

						/* Set del nome del pdi nella check */
						c.setText(pdi.getNome() + "\n");
						c.setTextSize(15);
						c.setId(pdi.hashCode());
						/*
						 * Associazione dell'oggetto da modellare all'oggetto
						 * grafico
						 */
						c.setTag(pdi);

						/* Generazione linea di separazione per ogni checkbox */
						TextView textViewSeparatore = new TextView(
								RicercaManualeActivity.this);
						textViewSeparatore.setBackgroundColor(Color.BLACK);
						textViewSeparatore.setHeight(2);

						/* Creazione delle stelle del rating */
						LinearLayout layoutRating = new LinearLayout(
								RicercaManualeActivity.this);
						LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
								ViewGroup.LayoutParams.FILL_PARENT,
								ViewGroup.LayoutParams.WRAP_CONTENT);
						layoutRating.setLayoutParams(lp);
						RatingBar ratingBar = new RatingBar(
								RicercaManualeActivity.this, null,
								android.R.attr.ratingBarStyleIndicator);
						ratingBar.setIsIndicator(true);
						ratingBar.setNumStars(5);
						try {
							ratingBar.setRating(pdi.getRating());
						} catch (Exception e) {
							ratingBar.setRating(0); // se rating e' null!
						}
						checkBoxSelezionaTutto.add(c);
						layoutPDI.addView(textViewSeparatore);

						/* Inserimento della checkbox nel linearlayout */
						layoutPDI.addView(c);

						/* Inserimento delle stelle nel linearlayout */
						layoutRating.addView(ratingBar);
						layoutPDI.addView(layoutRating);

						/* Listener checkbox */
						c.setOnCheckedChangeListener(new OnCheckedChangeListener() {
							public void onCheckedChanged(
									CompoundButton buttonView, boolean isChecked) {
								if (isChecked) {
									PDI p = (PDI) c.getTag();
									Iterator<PDI> pditeratore = listaPDIOttenuti
											.iterator();
									while (pditeratore.hasNext()) {
										PDI ptemp = (PDI) pditeratore.next();
										if (p.getNome().equals(ptemp.getNome())) {
											ptemp.setSelezionato(true);
											controlloInserimentoInformazioniBottone(bottoneProsegui);
										}
									}
								} else if (!isChecked) {
									PDI p = (PDI) c.getTag();
									Iterator<PDI> pditeratore = listaPDIOttenuti
											.iterator();
									while (pditeratore.hasNext()) {
										PDI ptemp = (PDI) pditeratore.next();
										if (p.getNome().equals(ptemp.getNome())) {
											ptemp.setSelezionato(false);
											controlloInserimentoInformazioniBottone(bottoneProsegui);
										}
									}
								}
							}
						});

					}
				} else {
					AlertDialog alertDialog = new AlertDialog.Builder(
							RicercaManualeActivity.this).create();
					alertDialog.setTitle("Attenzione");
					alertDialog
							.setMessage("La ricerca non ha ottenuto nessun risultato!");
					alertDialog.setButton("OK",
							new DialogInterface.OnClickListener() {
								public void onClick(DialogInterface dialog,
										int which) {
									return;
								}
							});
					alertDialog.show();
					layoutPDI.setVisibility(View.INVISIBLE);
				}

				dialog.dismiss();
			}
		};
		/*
		 * All'interno del thread si avvia la query a google; una volta finita,
		 * tramite l'handler aggiorno la grafica
		 */
		Thread checkUpdate = new Thread() {
			public void run() {
				/* Azzeramento dei risultati precedenti */
				listaPDITrovati.clear();
				listaPDIOttenuti.clear();

				listaPDITrovati = ConnessioneGoogle.ricercaPDI(
						elaborazione.getPosizione(), nomePdi, "it-IT", 3000,
						true);

				handler.sendEmptyMessage(0);
			}
		};
		checkUpdate.start();

		bottoneProsegui.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				startVisualizzaItinerarioActivity();
			}
		});

	}

	/**
	 * <p>
	 * Metodo che effettua il controllo sulle informazioni inserite dall'utente
	 * </p>
	 * 
	 * @return true se vengono inserite tutte le informazioni in maniera
	 *         corretta
	 */
	private boolean controlloInserimentoInformazioni() {

		Iterator<PDI> pditeratore = listaPDIOttenuti.iterator();
		while (pditeratore.hasNext()) {
			PDI ptemp = (PDI) pditeratore.next();
			if (ptemp.getSelezionato())
				return true;
		}
		return false;
	}

	/**
	 * <p>
	 * Metodo che effettua il controllo sull'abilitazione del pulsante
	 * buttonProsegui
	 * </p>
	 */
	private void controlloInserimentoInformazioniBottone(Button b) {
		boolean verifica = controlloInserimentoInformazioni();
		/* Caso parametri inseriti correttamente */
		if (verifica)
			b.setCompoundDrawablesWithIntrinsicBounds(
					R.drawable.arrow_right_icon, 0, 0, 0);
		else
			b.setCompoundDrawablesWithIntrinsicBounds(
					R.drawable.arrow_right_icon_disabled, 0, 0, 0);
		/* Abilitazione o meno del bottone in base ai parametri */
		b.setEnabled(verifica);
	}

	/**
	 * <p>
	 * Metodo che invoca l'activity relativa alla Visualizzazione
	 * dell'itinerario aggiornato
	 * </p>
	 */
	private void startVisualizzaItinerarioActivity() {

		Iterator<PDI> pditeratore = listaPDIOttenuti.iterator();
		/* Aggiunti all'itinerario i PDI selezionati dalla ricerca effettuata */
		while (pditeratore.hasNext()) {
			PDI p = (PDI) pditeratore.next();
			if (p.getSelezionato())
				itinerario.add(p);
		}

		pianificazione.setItinerario(itinerario);
		Intent intent = new Intent(this, VisualizzaItinerarioActivity.class);
		String pkg = getPackageName();
		intent.putExtra(pkg + ".elaborazione", elaborazione);
		intent.putExtra(pkg + ".pianificazione", pianificazione);
		startActivity(intent);
	}
}